package com.example.arouter;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import dalvik.system.DexFile;

/**
 * *******************************************************
 * Author: chinadragon
 * Time: 2023/8/13 17:27
 * Name:
 * Overview:
 * Usage:
 * *******************************************************
 */
public class ARouter {
    //有一个容器 装载了所有模块中的activity的类的对象 路由表
    private static Map<String, Class<? extends Activity>> map ; // 注意 map 是 static
    public ARouter(){
        map = new HashMap<>();
    }
    private static ARouter sARouter = new ARouter();

    public static ARouter getInstance() {
        return sARouter;
    }

    public void addActivity(String key, Class<? extends Activity> clazz){
        if (key == null || clazz == null || map.containsKey(key)){
            return;
        }

        map.put(key, clazz);

    }

    public void jumpActivity(String key, Bundle bundle){
        Class<? extends Activity> aClass = map.get(key);
        if (aClass == null) {
            return;
        }

        Intent intent = new Intent(mContext, aClass);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }

    private Context mContext;
    public void init(Context context){
        this.mContext = context;

        /*
            这里的处理方式性能差，需要优化，使用 asm 技术


            apt : arouter, butterkniffe  根据注解生成代码

            aspectj：注解处理器， aop 技术

            编译时技术： 修改代码

            asm：

            javassit：

         */


        //执行生成工具类中的方法，将activity的类对象加载到路由表中
//        List<String> classNameList = getClassName("com.example.util");
//        for (String className : classNameList) {
//            try {
//                Class<?> utilClass = Class.forName(className);
//                if (IRouter.class.isAssignableFrom(utilClass)){
//                    IRouter iRouter = (IRouter) utilClass.newInstance();
//                     iRouter.putActivity();
//                }
//
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }

    }

    private List<String> getClassName(String packageName){
        List<String> classlist = new ArrayList<>();

        try {
            //
            DexFile dexFile = new DexFile(mContext.getPackageCodePath());
            //不会发送类加载  消耗性能
            Enumeration<String> entries = dexFile.entries();
            while (entries.hasMoreElements()) {
                String className = entries.nextElement();
                if (className.contains(packageName)){
                    classlist.add(className);
                }
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }


        return classlist;
    }
}
